package com.bj58.mis.apm.server.statistics.mapper;

import com.bj58.mis.apm.server.statistics.dto.query.QueryDataGridItem;
import com.bj58.mis.apm.server.statistics.dto.query.QueryPercentile;
import com.bj58.mis.apm.server.statistics.dto.query.Statistics;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

@Mapper
public interface QueryMapper {

    /**
     * 查询统计信息
     *
     * @param cubeIdList 有权限的Cube ID列表
     * @param startDate  开始日期
     * @param endDate    结束日期
     * @return
     */
    public Statistics getStatisticsByHiveResult(@Param("cubeIdList") List<String> cubeIdList,
                                                @Param("startDate") String startDate,
                                                @Param("endDate") String endDate);



    /**
     * 获取每天的查询次数
     *
     * @param cubeIdList 有权限的Cube ID列表
     * @param startDate  开始时间
     * @param endDate    结束时间
     * @return
     */
    public List<Map<String, ?>> getQueryCountByHiveResult(@Param("cubeIdList") List<String> cubeIdList,
                                                          @Param("startDate") String startDate,
                                                          @Param("endDate") String endDate);


    /**
     * 获取每天查询的百分位数
     *
     * @param cubeIdList 有权限的Cube ID列表
     * @param startDate  开始时间
     * @param endDate    结束时间
     * @return
     */
    public List<QueryPercentile> queryPercentileByHiveResult(@Param("projectId") String projectId,
                                                             @Param("cubeId") String cubeId,
                                                             @Param("cubeIdList") List<String> cubeIdList,
                                                             @Param("startDate") String startDate,
                                                             @Param("endDate") String endDate);


    /**
     * 获取查询响应时间范围的百分比
     *
     * @param cubeIdList 有权限的Cube ID列表
     * @param startDate  开始时间
     * @param endDate    结束时间
     * @return
     */
    public List<Map<String, ?>> queryTimeDataByHiveResult(@Param("cubeIdList") List<String> cubeIdList,
                                                          @Param("startDate") String startDate,
                                                          @Param("endDate") String endDate);

    /**
     * 查询某时间范围内所有的查询时间和执行时间
     *
     * @param md5       sql和cubeid的md5值
     * @param state     状态.1表示成功执行的SQL;0表示执行失败的SQL
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return
     */
    public List<Map<String, ?>> queryHistory(@Param("md5") String md5,
                                             @Param("state") String state,
                                             @Param("startDate") String startDate,
                                             @Param("endDate") String endDate);

    /**
     * 查询某个SQL的信息
     *
     * @param md5       sql和cubeid的md5值
     * @param startDate 开始时间
     * @param endDate   结束时间
     * @return
     */
    public QueryDataGridItem getOneQueryLog(@Param("md5") String md5,
                                            @Param("startDate") String startDate,
                                            @Param("endDate") String endDate,
                                            @Param("state") String state);


    /**
     * 查询SQL列表
     *
     * @param cubeIdList 有权限的Cube ID列表
     * @param startDate  开始时间
     * @param endDate    结束时间
     * @param user       负责人
     * @param state      状态.1表示成功执行的SQL;0表示执行失败的SQL
     * @param searchKey  搜索的内容.可以是项目名称,也可以是cube名称
     * @param orderBy    排序的字段
     * @param sort       排序的方向。asc或者是desc
     * @param offset     分页的偏移量
     * @param limit      每页的记录数
     * @return
     */
    public List<QueryDataGridItem> queryDataGridByHiveResult(@Param("cubeIdList") List<String> cubeIdList,
                                                 @Param("startDate") String startDate,
                                                 @Param("endDate") String endDate,
                                                 @Param("user") String user,
                                                 @Param("state") String state,
                                                 @Param("searchKey") String searchKey,
                                                 @Param("orderBy") String orderBy,
                                                 @Param("sort") String sort,
                                                 @Param("offset") Integer offset,
                                                 @Param("limit") Integer limit);


    /**
     * 查询SQL列表符合条件的记录数
     *
     * @param cubeIdList 有权限的Cube ID列表
     * @param startDate  开始时间
     * @param endDate    结束时间
     * @param user       负责人
     * @param state      状态.1表示成功执行的SQL;0表示执行失败的SQL
     * @param searchKey  搜索的内容.可以是项目名称,也可以是cube名称
     * @return
     */
    public Integer queryDataGridCountByHiveResult(@Param("cubeIdList") List<String> cubeIdList,
                                      @Param("startDate") String startDate,
                                      @Param("endDate") String endDate,
                                      @Param("user") String user,
                                      @Param("state") String state,
                                      @Param("searchKey") String searchKey
    );


    /**
     * 根据项目ID查询所有的CUBE id
     * @param projectId
     * @return
     */
    public List<String> getProjectList(@Param("projectId") String projectId);

    /**
     * 普通用户根据权限列表,选择最后构建的cube
     * @param cubeIdList 有权限的Cube ID列表
     * @return
     */
    public List<String> getLastBuildCube(@Param("cubeIdList") List<String> cubeIdList);
}
